A library for reading and writing WEBC files.
The [`Container`] provides an abstraction over the various WEBC versions
this crate can handle. As such, it tries to cater to the lowest common
denominator and favors portability over performance or power.
```rust,no_run
use webc::Container;
let bytes: &[u8] = b"\0webc...";
let container = Container::from_bytes(bytes)?;
println!("{:?}", container.manifest());
println!("Atoms:");
for (name, atom) in container.atoms() {
let length = atom.len();
println!("{name}: {length} bytes");
}
for (name, volume) in container.volumes() {
let root_items = volume.read_dir("/").expect("The root directory always exists");
println!("{name}: {} items", root_items.len());
}
# Ok::<(), Box>(())
```
In general, errors that occur during lazy operations won't be accessible to
the user.
# Version-Specific Fallbacks
If more flexibility is required, consider using [`crate::detect()`] and
instantiating a compatible parser directly.
```rust,no_run
use webc::{
Container,
Version,
};
# #[cfg(feature = "v1")]
use webc::v1::{ParseOptions, WebC};
# #[cfg(feature = "v3")]
use webc::v3::read::OwnedReader;
let bytes: &[u8] = b"...";
match webc::detect(bytes) {
# #[cfg(feature = "v1")]
Ok(Version::V1) => {
let options = ParseOptions::default();
let webc = WebC::parse(bytes, &options).unwrap();
if let Some(signature) = webc.signature {
println!("Package signature: {:?}", signature);
}
}
# #[cfg(feature = "v3")]
Ok(Version::V3) => {
let webc = OwnedReader::parse(bytes).unwrap();
let index = webc.index();
let signature = &index.signature;
if !signature.is_none() {
println!("Package signature: {signature:?}");
}
}
Ok(other) => todo!("Unsupported version, {other}"),
Err(e) => todo!("An error occurred: {e}"),
}
```
# Feature Flags